package br.com.arg.aplica.data;

import br.com.arg.aplica.model.CodigoModelo;
import br.com.arg.aplica.model.Classe;
import br.com.arg.aplica.util.TipoCampo;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateful;
import javax.enterprise.context.SessionScoped;

import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;

@Stateful
//The @Model stereotype is a convenience mechanism to make this a
//request-scoped bean that has an
//EL name
//Read more about the @Model stereotype in this FAQ:
//http://sfwk.org/Documentation/WhatIsThePurposeOfTheModelAnnotation
@Named 
@SessionScoped 
public class CodigoGeraProducer {

	public CodigoGeraProducer() {
		stringList = new ArrayList<String>();
	}
	
	@Inject
	private EntityManager em;

	@Inject
	private List<CodigoModelo> codigoModelos;

	Classe formato;
	private String linha;
	private String linhaP1aPo;

	private List<String> stringList;
	
	public List<String> getStringList() {
		return stringList;
	}

	enum Comandos {
		TABLE, NOMECLASSE, ATRIBUTOS
	}

	private String getTipoCampo(TipoCampo tc) {
		switch (tc) {
		case Numerico:
			return "Long";
		case Boleano:
			return "boolean";
		case Data:
			return "Date";
		case DataFormatoDb2:
			return "Date";
		case BoleanoDB2:
			return "boolean";
		case ValorMonetario:
			return "Long";
		case Enumerador:
			return "String";
		default:
			return "String";
		}
	}

	void interprete(String comando) {
		try {
			switch (Comandos.valueOf(comando.toUpperCase())) {
			case TABLE:
				table();
				break;
			case NOMECLASSE:
				nomeClasse();
				break;
			case ATRIBUTOS:
				atributos();
				break;
			}
		} catch (IllegalArgumentException e) {
			System.out.println("Comando nao tabelado " + comando
					+ " <<<<<<<<<<<<<<<<<<<<<<<");
		}
	}

	void table() {
		stringList.add(linhaP1aPo);
	}

	void nomeClasse() {
//		linhaP1aPo = linhaP1aPo.replaceFirst("1nomeclasse1", formato.getClasseTela());
		stringList.add(linhaP1aPo);
	}

	void atributos() {
		
//		if (formato != null) {
//			for (Atributo c : formato.getCampos()){
//				String tipocampo = getTipoCampo(c.getTipoCampo());
//				stringList.add("	private " + tipocampo + " " + c.getNome() + ";\n");
//			}
//		}
	}

	public List<String> geraListaCodigo(String codigoFormato, String idModelo2Buscar) {
		formato = em.find(Classe.class, codigoFormato);
		String sql = "select cm.linha from CodigoModelo cm where cm.nome='" + idModelo2Buscar + "'";

		int posord = 0, posfim = 0;
		for (String s : em.createQuery(sql, String.class).getResultList()){
			linha = s + " ";
			posord = linha.indexOf("//#");
			if (posord > 0) {
				posord += 3;
				posfim = linha.indexOf(" ", posord) - 1;
				if (posfim > posord) {
					linhaP1aPo = linha.substring(0,posord-3).trim()+"\n";
					interprete(linha.substring(posord, posfim));
				}
			} else {
				stringList.add(linha);
			}
		}
		
		return stringList;
	}
}
